#ifndef __ELEMENT_H_
#define __ELEMENT_H_

#include "board.h"

extern enum {
    ENTER = 0,   // 开始
    QUIT,        // 停止
    TURN_LEFT,   // 左转
    TURN_RIGHT,  // 右转
    GO_STRAIGHT, // 直行
    Play         // 赛道记录播放
} Element_State; // 元素状态

extern enum {
    // 横断路障
    Block = 0,
    // 环岛入和出
    Round_In = 1,
    Round_Out = 2,
    // 驶入车库并停止
    Into_The_Garage_And_Stop = 3,
    Turn_Right_Into_The_Garage = 4,
    // 启动并驶出车库
    Start_And_Out_Of_The_Garage = 5,
    // 断路路口
    OpenJunction = 6,
    // 坡道
    Rampway = 7,
    // 直道
    Straightaway,
    // 弯道
    Curve,
    // 十字路口
    Crossroad,
    // 无元素
    No_Elem = 0xff,
    // 以下是在Elem.OutDirect中使用的
    // 左出库方向
    LeftDirect = -1,
    // 右出库方向
    RightDirect = 1,
} Road_Element;

// typedef struct
// {
//     fp32 DiffYaw; // 微分的Yaw
//     uint8 Step;
// } Record_type;

typedef struct
{
    uint8 Road;       // 主元素
    uint8 SubRoad;    // 子元素
    uint8 State;      // 元素状态
    uint16 Step;      // 步骤
    int8 OutDirect;   // 出库方向,1和-1
    bool LaserSW;     // 是否启用激光
    uint32 StartTime; // 元素发生时间点
    int16 RoundInMax[7];
    int16 RoundInMin[7];
    int16 RoundOutMax[7];
    int16 RoundOutMin[7];
    // uint8 Record;
    fp32 Distance; // 没换0和1传感器，不需要调电阻阻值确定距离
    uint16 BlockDist;
    bool FlashRead;
    bool FlashWrite;
} Elem_type;

// uint8 State;
// uint8 Step;
// int8 Angle;
// int16 Speed;
// int16 Displace;
typedef struct
{
    uint8 State;
    uint8 Step;
    int16 Angle;
    int16 Speed;
    int16 Displace;
} Response_type;

extern Elem_type Elem;
extern Response_type xdata Response[6][6];

void Elem_Init(void);
void Elem_Reset(uint8 _buzz);
void Elem_Identify(void);
void Elem_Response(void);
void Elem_E2PROM(void);

void RoundIn_ScanPoint(void);
void RoundOut_ScanPoint(void);

void Round_Identify(void);
void Block_Identify(void);

#endif // !__CONTROL_H_